package UI;
import Project.CilentReaderThread;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.io.DataOutputStream;

public class ChatMainFrame extends JFrame {
    private JTextArea chatArea;           // 聊天记录显示区
    private JTextField messageField;      // 消息输入框
    private JButton sendButton;           // 发送按钮
    public JList<String> onlineUsersList; // 在线用户列表
    private DefaultListModel<String> onlineUsersModel; // 在线用户模型
    private List<String> users;           // 在线用户列表
    private Socket socket;
    public ChatMainFrame(String Nickname, Socket socket)
    {
        this();
        this.setTitle(Nickname);
        this.socket=socket;
        //立即把客户端的socket交给一个独立的线程来处理，来读取服务端管道响应的数据
        new CilentReaderThread(socket,this).start();

    }
          public ChatMainFrame()
          {
              setSize(800, 600);
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口就退出程序

              // 初始化用户列表
              users = new ArrayList<>();
              users.add("User1"); // 假设有一些初始用户
              users.add("User2");

              // 创建聊天记录显示区
              chatArea = new JTextArea();
              chatArea.setEditable(false); // 设置不可编辑
              JScrollPane chatScrollPane = new JScrollPane(chatArea);

              // 创建在线用户列表
              onlineUsersModel = new DefaultListModel<>();
              for (String user : users) {
                  onlineUsersModel.addElement(user);
              }
              onlineUsersList = new JList<>(onlineUsersModel);
              onlineUsersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
              JScrollPane onlineUsersScrollPane = new JScrollPane(onlineUsersList);

              // 使用 GridBagLayout 进行布局
              setLayout(new GridBagLayout());
              GridBagConstraints gbc = new GridBagConstraints();
              gbc.insets = new Insets(5, 5, 5, 5); // 设置内边距

              // 添加聊天记录显示区
              gbc.gridx = 0;
              gbc.gridy = 0;
              gbc.weightx = 1.0;
              gbc.weighty = 1.0;
              gbc.fill = GridBagConstraints.BOTH;
              add(chatScrollPane, gbc);

              // 添加在线用户列表
              gbc.gridx = 1;
              gbc.gridy = 0;
              gbc.weightx = 0.3;
              gbc.fill = GridBagConstraints.BOTH;
              add(onlineUsersScrollPane, gbc);

              // 创建底部面板，用于消息输入框和发送按钮
              JPanel bottomPanel = new JPanel(new BorderLayout());
              messageField = new JTextField(); // 使用默认宽度，使其填满可用空间
              messageField.setPreferredSize(new Dimension(400, 50)); // 设置高度
              bottomPanel.add(messageField, BorderLayout.CENTER);

              sendButton = new JButton("发送");
              sendButton.addActionListener(new ActionListener() {
                  @Override
                  public void actionPerformed(ActionEvent e) {
                      String message = messageField.getText().trim();
                      if (!message.isEmpty()) {

                          try {
                              SendMsgtoServer(message);
                              messageField.setText("");
                          } catch (Exception ex) {
                              throw new RuntimeException(ex);
                          }



//                          // 将消息添加到聊天记录
//                          chatArea.append("你: " + message + "\n");
//                          // 清空消息输入框
//
//                          // 这里可以添加代码将消息发送给服务器或其他客户端
                      }
                  }
              });
              bottomPanel.add(sendButton, BorderLayout.EAST);

              // 添加底部面板
              gbc.gridx = 0;
              gbc.gridy = 1;
              gbc.gridwidth = 2; // 占据两列
              gbc.weightx = 1.0;
              gbc.weighty = 0.1;
              gbc.fill = GridBagConstraints.HORIZONTAL;
              add(bottomPanel, gbc);

              // 设置窗口居中显示
              this.setLocationRelativeTo(null);
              this.setVisible(true);
          }

    private void SendMsgtoServer(String message) throws Exception
    {

        DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
        dos.writeInt(2);
        dos.writeUTF(message);
    }

    //更新在线用户列表
    public void updateOnlineUserList(List<String> OnlineNames)
    {
        onlineUsersModel.clear();
        for(String name:OnlineNames)
        {
            onlineUsersModel.addElement(name);
        }

    }

    //更新聊天界面
    public void UpdateChatRoom(String content)
    {
        //把content追加到聊天记录中
        chatArea.append(content+"\n");
    }
}